package com.springboot.springboot_demo.controller;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Title: StatisticsController.class <br>
 * Description: <br>
 * Create DateTime:2022/6/14 10:35 <br>
 *
 * @author peichang.yang
 */
public class StatisticsController {

    /**
     * Java统计各个时段上的人数
     * 场景重现：
     * 我们将一天分割成24份，每份间隔1小时，[0-1]，[1-2]，[2-3]…，[23-0]
     * 根据考勤时间，然后我们统计一下，在各个时段上加班的人数。
     *
     * 实现步骤：
     * 步骤一、时间段分割： 将个人加班时间，分割成多个，匹配上面的24个时段。
     * 步骤二、将每个人分割后的时间片段汇总到一个集合中，然后统计出每个时间片段的总数。
     * ————————————————
     * 版权声明：本文为CSDN博主「不开窍」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/weixin_40434637/article/details/101421336
     */

    /**
     * 步骤一：
     * 给你个开始时间，一个结束时间，将这个时间间隔分割，匹配到上面的24个时间段上。
     * 比如，
     * 开始时间：“2019-09-23 10:30”,
     * 结束时间：“2019-09-23 19:30”
     * 要求分割结果为：[10-11]，[11-12]，[12-13]，[13-14]，[14-15]，[15-16]，[16-17]，[17-18]，[18-19]，[19-20]
     *
     * 实现方法：
     */

    /**
     * 【开始时间，结束时间】把时间段按每1小时切割一次
     * 我们把一天切割为24段，将给定的时间段进行切割，匹配到这些时间段上。
     * @param startDateTime 开始时间
     * @param endDateTime 结束时间
     * @return
     */
    public static List<String> cutInterval(String startDateTime, String endDateTime){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        LocalDateTime localDateTime1 =LocalDateTime.parse(startDateTime, formatter);
        LocalDateTime end =LocalDateTime.parse(endDateTime, formatter);

        //秒数置为0
        LocalDateTime start = localDateTime1.withMinute(0);
        System.out.println(localDateTime1);

        String str = start.format(formatter);
        System.out.println(str);

        //时间段分割
        List<String> list = new ArrayList<>();
        while(start.plusHours(1).isBefore(end.plusHours(1)))
        {
            list.add(start.getHour()+"-"+start.plusHours(1).getHour());
            start=start.plusHours(1);
        }

        list.forEach(item-> System.out.println(item));

        return list;
    }


    /**
     *   步骤二：
     *     就是统计List集合中，各个时间片段的总个数。
     *     这里使用java8中的stream，来进行分组统计。
     */

    /**
     * 分组，统计list中每个元素出现的次数
     * @param list
     * @return
     */
    public static Map<String,Long> getCountMap(List<String> list){
        Map<String,Long> map = list.stream().collect(Collectors.groupingBy(p->p,Collectors.counting()));
        map.forEach((k,v) -> System.out.println(k + ":" +v));

        return map;
    }


    public static void main(String[] args) {
        List<String> list = cutInterval("2019-09-24 17:30", "2019-09-24 22:00");
        System.out.println("====================================");
        List<String> list2 = cutInterval("2019-09-24 17:30", "2019-09-24 22:00");
        System.out.println("====================================");
        List<String> list3 = cutInterval("2019-09-23 17:30", "2019-09-23 23:30");
        System.out.println("====================================");
        List<String> list4 = cutInterval("2019-09-24 18:00", "2019-09-25 23:00");
        System.out.println("====================================");
        List<String> list5 = cutInterval("2019-09-23 10:00", "2019-09-23 19:30");

        System.out.println("*****************************************************");
        List<String> resultList = new ArrayList<>();
        resultList.addAll(list);
        resultList.addAll(list2);
        resultList.addAll(list3);
        resultList.addAll(list4);
        resultList.addAll(list5);
        System.out.printf("---->" + getCountMap(resultList));
    }
}
